import requests
from typing import List, Dict, Optional
from dataclasses import dataclass
from app.db.database import SessionLocal
from app.db.crud import create_tpost
from urllib.parse import quote
from app.pacong.content_fetcher import ContentFetcher

@dataclass
class BilibiliHotItem:
    """B站热搜条目的数据类"""
    hot_id: int
    keyword: str
    show_name: str
    score: float
    word_type: int
    goto_type: int
    goto_value: str
    icon: Optional[str]
    heat_score: float

class BilibiliHotSearchCrawler(ContentFetcher):
    """
    用于从B站热搜API获取数据并处理的类。
    """

    def __init__(self):
        """
        初始化类实例。
        """
        self.url = "https://s.search.bilibili.com/main/hotword"
        self.base_search_url = "https://search.bilibili.com/all"
        self.content_type = 3  # B站的source_id设为3

    def my_fetch(self) -> Dict:
        """
        发送HTTP GET请求，获取API响应。

        :return: 返回JSON响应。
        :raises: 如果请求失败，抛出HTTPError。
        """
        params = {
            'limit': 30  # 获取前30个热搜
        }
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        response = requests.get(self.url, params=params, headers=headers)
        response.raise_for_status()
        return response.json()

    def process_icon_url(self, icon_url: Optional[str]) -> Optional[str]:
        """
        处理图标URL。

        :param icon_url: 原始图标URL
        :return: 处理后的图标URL
        """
        if not icon_url:
            return None
        return icon_url

    def fetch_content(self) -> List[Dict]:
        """
        从API获取数据并处理。

        :return: 返回处理后的数据列表。
        """
        # 获取API响应
        response_data = self.my_fetch()
        
        if response_data['code'] != 0:  # B站API正常返回code为0
            raise ValueError(f"API返回错误: {response_data.get('exp_str', '未知错误')}")
            
        result = []
        for item in response_data.get('list', []):
            # 构建搜索URL
            search_url = f"{self.base_search_url}?keyword={quote(item['keyword'])}"
            
            # 添加到结果列表
            result.append({
                "id": item['keyword'],
                "title": item['show_name'],
                "url": search_url,
                "extra": {
                    "icon": self.process_icon_url(item.get('icon')),
                    "score": item.get('score'),
                    "heat_score": item.get('heat_score')
                }
            })
        
        return result


# 示例调用
if __name__ == "__main__":
    # 创建类实例
    crawler = BilibiliHotSearchCrawler()
    
    # 获取并保存数据
    crawler.fetch_and_save() 